package org.fjsei.yewu.jyjc;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.text.SimpleDateFormat;

public class JSONUtils {

	private static final ObjectMapper objectMapper = new ObjectMapper();

	static {
		// 注册Java 8日期时间API的模块
		objectMapper.registerModule(new JavaTimeModule());

		// 自定义日期格式
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
		objectMapper.setDateFormat(dateFormat);

		// 配置ObjectMapper以处理空值（可选）
		objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

		// 如果需要自定义字符串的序列化方式，可以添加以下代码（例如，将String类型的日期也按照特定格式处理）
		// SimpleModule module = new SimpleModule();
		// module.addSerializer(String.class, new ToStringSerializer(null)); // 注意：这通常不是一个好主意，因为它会改变所有String的序列化行为
		// objectMapper.registerModule(module);
		// 但是，对于日期字符串的特殊处理，你应该在反序列化时处理，而不是在这里改变String的序列化行为。
	}

	public static String encode(Object obj) throws JsonProcessingException {
		if (obj == null || obj.toString().equals("null")) {
			return null;
		}
		if (obj instanceof String) {
			return (String) obj; // 直接返回字符串，不做序列化
		}
		return objectMapper.writeValueAsString(obj);
	}

	public static Object decode(String json) throws JsonProcessingException {
		if (json == null || json.isEmpty()) {
			return ""; // 或者返回null，根据你的需求
		}
		// 注意：这里不会递归地解码已经解码为字符串的JSON对象，因为那通常不是期望的行为。
		// 如果你确实需要这样的行为，你可能需要编写更复杂的逻辑来检测和解码嵌套的JSON字符串。
		return objectMapper.readValue(json, Object.class);
	}

	// 辅助方法：检查字符串是否为null或空
	private static boolean isNullOrEmpty(String str) {
		return str == null || str.isEmpty();
	}

	// 注意：在实际应用中，你可能希望将异常处理委托给调用者，而不是在这里捕获并返回默认值。
	// 例如，你可以让encode和decode方法抛出异常，而不是捕获它们。
}
